package Utils.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK原生代理，被代理的类需要先实现一个接口，生成的Proxy只能代理接口中定义的方法。
 * 使用示例：
 * <p>
 * Host host = new Host();
 * ProxyInvocationHandler handler = new ProxyInvocationHandler(host);
 * Rent proxy = (Rent) handler.getProxy();
 * proxy.rent();
 *
 * @author d11yu
 */
public class ProxyInvocationHandler implements InvocationHandler {
    private Object target;

    public ProxyInvocationHandler(Object target) {
        this.target = target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    /**
     * @param proxy  例：this
     * @param method 建议用ReflectUtils.getDeclaredMethod方法获取。
     * @param args   如果不用传参数，可以传：new Object[]{}或者null。
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target, args);
    }
}
